package multiplex.facade;

import java.util.List; 

import multiplex.model.CompraMarcada;
import multiplex.model.CompraNaoMarcada;
import multiplex.model.Filme;
import multiplex.model.Localizacao;
import multiplex.model.Preco;
import multiplex.model.Promocao;
import multiplex.model.PromocaoFilme;
import multiplex.model.PromocaoLocalizacao;
import multiplex.model.PromocaoMeioPagamento;
import multiplex.model.Sala;
import multiplex.model.Sessao;
import multiplex.model.Usuario;
import multiplex.model.Preco;

public class Facade implements IFacade{
	private FilmeFacade filmeFacade;
	private SalaFacade salaFacade;
	private LocalizacaoFacade localizacaoFacade;
	private UsuarioFacade usuarioFacade;
	private PromocaoFacade promocaoFacade;
	private SessaoFacade sessaoFacade;
	private CompraFacade compraFacade;
	private PrecoFacade precoFacade;
	
	public Facade() {
		filmeFacade = new FilmeFacade();
		salaFacade = new SalaFacade();
		localizacaoFacade = new LocalizacaoFacade();
		usuarioFacade = new UsuarioFacade();
		promocaoFacade = new PromocaoFacade();
		sessaoFacade = new SessaoFacade();
		compraFacade = new CompraFacade();
		precoFacade = new PrecoFacade();
	}
	
    public List<Filme> getFilmesExibicao(){return filmeFacade.getFilmesExibicao();} //retorna lista de Filmes em exibi��o em ordem alfab�tica com estr�ias primeiro
    public List<Filme> getFilmesExibeLocalizacao(Localizacao olocalizacao){ return filmeFacade.getFilmesExibeLocalizacao(olocalizacao);}//
    public List<Filme> getFilmesEmBreve(){return filmeFacade.getFilmesEmBreve();}//retorna lista de Filmes que entrar�o em exibi��o na rede multiplex
    public boolean cadFilme(Filme oFilme){ return filmeFacade.cadFilme(oFilme);}
    public List<Filme> getFilme(String nome){return filmeFacade.getFilme(nome);}
    public List<Filme> getDestaques(){return filmeFacade.getDestaques();}
    public List<Filme> getNaoDestaques(){return filmeFacade.getNaoDestaques();}
	public void alteraFilme(Filme oFilme) { filmeFacade.alteraFilme(oFilme); }//altera Filme
	public void removeFilme(Filme oFilme) { filmeFacade.removeFilme(oFilme); }//remove Filme
	public Filme getFilmeById(int id) {		return filmeFacade.getFilmeById(id);	}
	public boolean cadDestaque(List<Filme> oDestaque){return filmeFacade.cadDestaque(oDestaque);}
	public List<String> getCidadeByFilme(Filme oFilme){ return localizacaoFacade.getCidadeByFilme(oFilme);}
	
	public List<Localizacao> getAllLocalizacao(){ return localizacaoFacade.getAllLocalizacao();}
    public List<Localizacao> getLocalizacaoFilme(Filme oFilme){return localizacaoFacade.getLocalizacaoFilme(oFilme);}//retorna lista de localiza��es que exibem o Filme
    public List<Localizacao> getLocalizacao(String nome){return localizacaoFacade.getLocalizacao(nome);}//busca Filme na base    
	public void alteraLocalizacao(Localizacao oLocalizacao) { localizacaoFacade.alteraLocalizacao(oLocalizacao); }//altera Localizacao
	public void removeLocalizacao(Localizacao oLocalizacao) { localizacaoFacade.removeLocalizacao(oLocalizacao); }//remove Localizacao
	public boolean cadLocalizacao(Localizacao olocalizacao){ return localizacaoFacade.cadLocalizacao(olocalizacao);}
	
    public List<Sessao> getSessaoFilme(Filme oFilme){return sessaoFacade.getSessaoFilme(oFilme);} //retorna lista de sessoes do filma para os pr�ximos 4 dias
    public List<Sessao> getSessao4DiasBySala(Sala oSala){ return sessaoFacade.getSessao4DiasBySala(oSala);}
    public Sessao getSessaoById(int sessaoId){ return sessaoFacade.getSessaoById(sessaoId);}
    
    public Usuario autenticaUsuario(String email, String senha){return usuarioFacade.autenticaUsuario(email, senha);} //retorna o usuario do login e senha passados, null caso o usuario n�o esteja cadastrado
    public boolean cadUsuario (Usuario oUsuario){ return usuarioFacade.cadUsuario(oUsuario);} //cadastra o usu�rio na base, retorna 0 caso ocorra erro e 1 caso seja bem sucedido
    
    public int cadCompraMarcada(CompraMarcada oCompra, Sessao oSessao){return compraFacade.cadCompraMarcada(oCompra, oSessao);}//verifica a disponibilidade de assentos e cadastra a compra na Base, retorna 0 caso n�o haja acento, -1 caso haja erro no cart�o de credito e 1 caso seja bem sucedido
    public int cadCompraNaoMarcada(CompraNaoMarcada oCompra, Sessao oSessao){return compraFacade.cadCompraNaoMarcada(oCompra, oSessao);}//verifica a disponibilidade de assentos e cadastra a compra na Base, retorna 0 caso n�o haja acento, -1 caso haja erro no cart�o de credito e 1 caso seja bem sucedido    
   
    public List<Promocao> getPromocoes(){return promocaoFacade.getPromocoes();}//retorna lista de promocoes
    public boolean cadPromocaoDeFilme(PromocaoFilme oPromocao){ return promocaoFacade.cadPromocaoDeFilme(oPromocao);}//cadastra ou atualiza Filme
    public boolean cadPromocaoDeLocalizacao(PromocaoLocalizacao oPromocao){ return promocaoFacade.cadPromocaoDeLocalizacao(oPromocao);}//cadastra ou atualiza Filme
    public boolean cadPromocaoDeMeioDePagamento(PromocaoMeioPagamento oPromocao){ return promocaoFacade.cadPromocaoDeMeioDePagamento(oPromocao);}//cadastra ou atualiza Filme
    public List<Promocao> getPromocao(String nome){return promocaoFacade.getPromocao(nome);}//busca Filme na base
	public List<PromocaoFilme> getPromocaoByFilme(Filme oFilme){ return promocaoFacade.getPromocaoByFilme(oFilme);}
	public boolean removePromocaoFilme(Filme oFilme){ return promocaoFacade.removePromocaoFilme(oFilme);}
    public boolean alteraPromocaoFilme(PromocaoFilme oPromocao){ return promocaoFacade.alteraPromocaoFilme(oPromocao);}
	
    public boolean cadSala(Sala osala){ return salaFacade.cadSala(osala);}
    public List<Sala> getSala(Localizacao oLocalizacao){return salaFacade.getSala(oLocalizacao);}//busca Filme na base
    public List<Sala> getSalas(){return salaFacade.getSalas();}
	public void alteraSala(Sala oSala) { salaFacade.alteraSala(oSala); }//altera Sala
	public void removeSala(Sala oSala) { salaFacade.removeSala(oSala); }//remove Sala
	public List<Sala> getSalaByFilmeCidade(Filme oFilme, String cidade){return salaFacade.getSalaByFilmeCidade(oFilme, cidade);} 
	
	public Preco getPreco() {return precoFacade.getPreco();}
	public void updatePreco(Preco preco) { precoFacade.updatePreco(preco);}
	public void updatePrecoSemana(double PrecoSemana){ precoFacade.updatePrecoSemana(PrecoSemana); }
	public void updatePrecoFimdeSemana( double PrecoFimdesemana) { precoFacade.updatePrecoFimdeSemana(PrecoFimdesemana); }	
}
